package com.hmdp.service.impl;

import cn.hutool.json.JSONUtil;
import com.hmdp.dto.Result;
import com.hmdp.entity.ShopType;
import com.hmdp.mapper.ShopTypeMapper;
import com.hmdp.service.IShopTypeService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

import static com.hmdp.utils.RedisConstants.CACHE_SHOP_TYPE_KEY;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author 虎哥
 * @since 2021-12-22
 */
@Service
public class ShopTypeServiceImpl extends ServiceImpl<ShopTypeMapper, ShopType> implements IShopTypeService {
    @Resource
    StringRedisTemplate stringRedisTemplate;
    //利用redis查询商户类型信息

    @Override
    public Result queryTypeList() {
        String key = CACHE_SHOP_TYPE_KEY;
        // 2.判断是否存在
        String typeList = stringRedisTemplate.opsForValue().get(key);
        // 3.存在则直接返回
        if (typeList != null && !typeList.isEmpty()) {
            // 检查从 Redis 获取的值是否是有效的 JSON 格式
            try {
                List<ShopType> result = JSONUtil.toList(JSONUtil.parseArray(typeList), ShopType.class);
                return Result.ok(result);
            } catch (Exception e) {
                // 如果解析失败，记录日志并删除 Redis 中的错误数据
                log.error("解析 Redis 数据失败：" + e.getMessage());
                stringRedisTemplate.delete(key);
            }
        }
        // 4.不存在则查询数据库
        List<ShopType> typeList1 = query().orderByAsc("sort").list();
        // 5.数据库为空返回错误
        if (typeList1 == null || typeList1.isEmpty()) {
            return Result.fail("查询失败");
        }
        // 6.存在，写入 redis
        String jsonStr = JSONUtil.toJsonStr(typeList1);
        stringRedisTemplate.opsForValue().set(key, jsonStr);
        // 7.返回
        return Result.ok(typeList1);
    }
}
